核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//记录当前趟数的最大值的角标
int pos ;

//交换的变量
int temp;


//外层循环控制需要排序的趟数
for (int i = 0; i < arrays.length - 1; i++) {

//新的趟数、将角标重新赋值为0
pos = 0;

//内层循环控制遍历数组的个数并得到最大数的角标
for (int j = 0; j < arrays.length - i; j++) {

if (arrays[j] > arrays[pos]) {
pos = j;
}

}
//交换
temp = arrays[pos];
arrays[pos] = arrays[arrays.length - 1 - i];
arrays[arrays.length - 1 - i] = temp;
}

1 选择排序

原理 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完。

一、第一趟排序

它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完

首先,我们创建数组,找到它最大的值(这就很简单了):

1
2
3
4
5
6
7
8
9
10
11
int[] arrays = {2, 3, 1, 4, 3, 5, 1, 6, 1, 2, 3, 7, 2, 3};

//假定max是最大的
int max = 0;


for (int i = 0; i < arrays.length; i++) {
if (arrays[i] > max) {
max = arrays[i];
}
}

随后这个最大的数和数组末尾的数进行交换:

1
2
3
4
5
//使用临时变量,让两个数互换
int temp;
temp = arrays[11];
arrays[11] = arrays[13];
arrays[13] = temp;

那么经过第一趟排序,我们的最大值已经到了数组的末尾了。

二、第二趟排序

再次从数组获取最大的数(除了已经排好的那个}:

1
2
3
4
5
6
int max2 = 0;
for (int i = 0; i < (arrays.length - 1); i++) {
if (arrays[i] > max2) {
max2 = arrays[i];
}
}

再将获取到的最大值与数组倒数第二位交换:

1
2
3
temp = arrays[7];
arrays[7] = arrays[12];
arrays[12] = temp;

经过第二次排序,已经能够将数组最大两个数进行排序了

三、代码简化

从前两趟排序其实我们就可以摸出规律了:

  • 一个数组是需要n-1趟排序的(因为直到剩下一个元素时,才不需要找最大值)
  • 每交换1次,再次找最大值时就将范围缩小1
  • 查询当前趟数最大值实际上不用知道最大值是多少(上面我查出最大值,还要我手动数它的角标),知道它的数组角标即可,交换也是根据角标来进行交换

第一趟:遍历数组14个数,获取最大值,将最大值放到数组的末尾[13]
第二趟:遍历数组13个数,获取最大值,将最大值放到数组倒数第二位[12]

….

数组有14个数,需要13趟排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//记录当前趟数的最大值的角标
int pos ;

//交换的变量
int temp;


//外层循环控制需要排序的趟数
for (int i = 0; i < arrays.length - 1; i++) {

//新的趟数、将角标重新赋值为0
pos = 0;

//内层循环控制遍历数组的个数并得到最大数的角标
for (int j = 0; j < arrays.length - i; j++) {

if (arrays[j] > arrays[pos]) {
pos = j;
}

}
//交换
temp = arrays[pos];
arrays[pos] = arrays[arrays.length - 1 - i];
arrays[arrays.length - 1 - i] = temp;
}